perm filename IO[GEO,BGB] blob
sn#086508 filedate 1974-02-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE IO - GEM INPUT/OUTPUT - BGB - FEBRUARY 1973.
C00005 00003 SUBR(PLOTO) DISPLAY BUFFER TO DISK FILE.
C00008 00004 SUBR(GETFIL,EXT) SETUP FILE SPEC FROM TTY LINE.
C00010 00005 SUBR(SERIAL,BODY) SERIAL NUMBER THE ALT LINKS OF A BODY.
C00012 00006 SUBR(OFEV,BODY) OUTPUT THE FEV OF A BODY.
C00015 00007 SUBR(OUTB3D,BODY) OUTPUT B3D BODY.
C00017 00008 SUBR(ICAM) INPUT CAMERA.
C00019 00009 SUBR(OCAM) OUTPUT CAMERA.
C00021 00010 SUBR(IFEV,BODY) INPUT F.E.V. BLOCKS.
C00024 00011 SUBR(IBODY,BODY0) INPUT A BODY AND ALL ITS PARTS.
C00026 00012 SUBR(INB3D) INPUT B3D FORMAT.
C00028 ENDMK
C⊗;
TITLE IO - GEM INPUT/OUTPUT - BGB - FEBRUARY 1973.
EXTERN MKB,MKF,MKE,MKV,MKFRAME,BATT,FCCW
↓CMDCHN←←16
↓IODEND←20000
FILNAM:0 ;FILE NAME.
EXTION:0↔0 ;EXTENSION.
PPPN:0 ;PROJECT-PROGRAMMER.
OBUF:BLOCK 3 ;OUTPUT BUFFER HEADER.
IBUF:BLOCK 3 ;INPUT BUFFER HEADER.
CMDHDR: BLOCK 3 ;COMMAND BUFFER HEADER
EOF: 0 ;END OF FILE FLAG.
GEMFLG: 0 ;KIND OF FILE FORMAT 0 FOR B3D, -1 FOR GEM.
;+1 FOR GEM CALLED BY SAIL.
CMDBUF: BLOCK 2*(201+2)
BLOCK 3
BFRAME:BLOCK 9 ;BODY FRAME BUFFER.
PCNT:0 ;PARTS COUNT.
FCNT:0 ;FACE COUNT.
ECNT:0 ;EDGE COUNT.
VCNT:0 ;VERTEX COUNT.
PLTFLG↑: 0 ;SET DURING PLOT OUTPUT TO DISABLE III KLUDGES
SUBR(WORDO,WORD) ;WORD OUTPUT.
COMMENT ⊗------------------------------------------------------------
⊗
LAC WORD
SOSG OBUF+2↔OUT 1,0
GO[IDPB 0,OBUF+1↔POP1J]
FATAL(WORDO)
ENDR;2/18/73(BGB)----------------------------------------------------
WORDIN: ;----------------------------------------------------------
BEGIN WORDIN; WORD INPUT TO AC0 - BGB - 18 FEBRUARY 1973.
SOSG IBUF+2↔IN 1,0
GO[ILDB 0,IBUF+1↔POPJ P,]
STATO 1,1B22↔GO[FATAL(WORDIN)]
SETOM EOF↔POPJ P,
BEND;2/18/73(BGB)--------------------------------------------------
SUBR(PLOTO) ;DISPLAY BUFFER TO DISK FILE.
COMMENT ⊗------------------------------------------------------------
⊗
EXTERN DPYBUF,GEODPY
SETOM PLTFLG
CALL(GEODPY)
SETZM PLTFLG
CALL(GETFIL,[SIXBIT/PLT/])↔POP0J
LAC 1,DPYBUF↔LACN(1)1↔SUBI 2
CDR 2,(1)↔SETZM 1(2)
MOVS↔LAPI -1(1)↔DAC DUMLST
INIT 1,17↔SIXBIT/DSK/↔0↔HALT
ENTER 1,FILNAM↔GO .+4
OUT 1,DUMLST↔JFCL
OUTSTR[ASCIZ" EOF.
"]↔ RELEASE 1,
POP0J
DUMLST: 0↔0
ENDR PLOTO;12/10/72(BGB)---------------------------------------------
SUBR(IGEM)
POP 16,STRING↔POP 16,0↔DAPZ STRCNT
AOS GEMFLG↔CALL(INB3D)↔SETZM GEMFLG↔POP0J
ENDR IGEM;8/27/73(BGB)-----------------------------------------------
SUBR(OGEM,BODY)
POP 16,STRING↔POP 16,0↔DAPZ STRCNT
AOS GEMFLG↔CALL(OUTB3D,BODY)↔SETZM GEMFLG↔POP1J
ENDR OGEM;8/27/73(BGB)-----------------------------------------------
STRING:0 ;STRING BYTE POINTER.
STRCNT:0 ;STRING BYTE COUNT.
SUBR(GETFIL,EXT) ;SETUP FILE SPEC FROM TTY LINE.
COMMENT ⊗------------------------------------------------------------
⊗
DZM FILNAM
DZM EXTION
DZM EXTION+1
DZM PPPN
L0: LAC 1,[POINT 6,FILNAM,-1]↔LACI 2,6
CALL(GETCL0)
CAIL"a"↔SUBI 40
CAIN 15↔GO[INCHWL↔POP1J]↔AOSA(P)
L: CALL(GETCL0)↔CAIL"a"↔SUBI 40
CAIN"."↔GO[SETZM ARG1↔LAC 1,[POINT 6,EXTION,-1]↔LACI 2,3↔GO L]
CAIN"["↔GO[LAC 1,[POINT 6,PPPN,-1] ↔LACI 2,3↔GO L]
CAIN","↔GO[LAC 1,[POINT 6,PPPN,17] ↔LACI 2,3↔GO L]
CAIN"]"↔GO L
CAIN 15↔GO EOL ;END OF THE LINE.
CAIN 12↔GO EOL
JUMPE EOL ;NULLS.
CAIG" "↔GO L ;IGNORE GARBAGE.
SOJL 2,L
SUBI 40↔IDPB 1↔GO L ;ASCII TO SIXBIT.
EOL: CALL(GETCL0)
CAR PPPN
TRNN 77↔LSH -6↔TRNN 77↔LSH -6 ;RIGHT ADJUST PROJECT.
DIP PPPN
CDR PPPN
TRNN 77↔LSH -6↔TRNN 77↔LSH -6 ;RIGHT ADJUST PROGRAMMER.
DAP PPPN
SKIPN 1,EXTION↔LAC 1,ARG1↔DAC 1,EXTION ;DEFAULT EXTENSION.
POP1J
ENDR GETFIL;2/18/73(BGB)---------------------------------------------
GETCL0:
SETZ↔SOSL STRCNT↔ILDB STRING↔POPJ P, ;LOP THE STRING.
SUBR(SERIAL,BODY) ;SERIAL NUMBER THE ALT LINKS OF A BODY.
COMMENT ⊗------------------------------------------------------------
⊗
LAC 1,BODY↔TEST 1,BBIT↔POP1J
;COUNT FACES, EDGES, AND VERTICES.
LACI 1↔PFACE 1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC FCNT
LACI 1↔PED 1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC ECNT
LACI 1↔PVT 1,1↔ALT. 0,1↔CAME 1,ARG1↔AOJA .-3↔SOS↔DAC VCNT
;COUNT PARTS.
SETZ↔SON 1,1↔DAC 1,2↔JUMPE 1,.+5↔AOS
BRO 2,2↔CAME 1,2↔AOJA .-2
DAC PCNT
;OUTPUT BODY HEADER.
CALL(WORDO,PCNT)
CALL(WORDO,FCNT)
CALL(WORDO,ECNT)
CALL(WORDO,VCNT)
LAC 1,ARG1
CALL(WORDO,{-2(1)}) ;PNAME.
CALL(WORDO,{-1(1)}) ;PNAME.
SKIPN GEMFLG↔GO L0
CALL(WORDO,{0(1)}) ;BODY TYPE BITS.
CALL(WORDO,{8(1)}) ;USER'S BODY WORD.
;BODIES LOCATION ORIENTATION MATRIX.
L0: FRAME 1,1↔SKIPN 1↔LACI 1,L2 ;BODY'S FRAME OR EMPTY.
LACI 2,=12↔SUBI 1,3
L1: CALL(WORDO,{(1)})↔AOS 1↔SOJG 2,L1
POP1J
BLOCK 3 ;EMPTY FRAME.
L2: BLOCK 9
ENDR SERIAL;2/18/73(BGB)---------------------------------------------
SUBR(OFEV,BODY) ;OUTPUT THE FEV OF A BODY.
COMMENT ⊗------------------------------------------------------------
⊗
LAC 1,BODY
L1: PFACE 1,1↔CAMN 1,ARG1↔GO L2
CALL(WORDO,{4(1)}) ;FIRST FACE DATA WORD - REFLECTIVITIES.
CALL(WORDO,{5(1)}) ;SECOND FACE DATA WORD - ILLUMINOUSITIES.
SKIPN GEMFLG↔GO L1
CALL(WORDO,{0(1)}) ;FACE TYPE BITS.
CALL(WORDO,{8(1)}) ;USER'S FACE WORD.
GO L1
L2: PED 1,1↔CAMN 1,ARG1↔GO L3 ;OUTPUT EDGE NODES.
NFACE 2,1↔ALT 2,2↔DIP 2,0
PFACE 2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
NVT 2,1↔ALT 2,2↔DIP 2,0
PVT 2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
NCW 2,1↔ALT 2,2↔DIP 2,0
PCW 2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
NCCW 2,1↔ALT 2,2↔DIP 2,0
PCCW 2,1↔ALT 2,2↔DAP 2,0↔CALL(WORDO,0)
SKIPN GEMFLG↔GO L2
CALL(WORDO,{0(1)}) ;EDGE TYPE BITS.
CALL(WORDO,{8(1)}) ;USERS EDGE WORD.
GO L2
L3: PVT 1,1↔CAMN 1,ARG1↔POP1J ;OUTPUT VERTEX NODES.
CALL(WORDO,{XWC(1)})
CALL(WORDO,{YWC(1)})
CALL(WORDO,{ZWC(1)})
SKIPN GEMFLG↔GO L3
CALL(WORDO,{0(1)}) ;VERTEX TYPE BITS.
CALL(WORDO,{8(1)}) ;USERS VERTEX WORD.
GO L3
ENDR OFEV;2/18/73(BGB)-----------------------------------------------
SUBR(OBODY,BODY) ;OUTPUT BODY AND ITS PARTS.
COMMENT ⊗------------------------------------------------------------
⊗
ACCUMULATORS{N,B}
CALL(SERIAL,BODY) ;SERIAL NUMBER THE F.E.V.
CALL(OFEV,BODY) ;OUTPUT THE F.E.V.
LAC B,BODY
SON N,B↔JUMPE N,L2 ;EXIT - AIN'T GOT NO PARTS.
L1: PUSHP N↔CALL(OBODY,N) ;RECURSE - ON SUB PARTS.
POPP N↔LAC B,BODY
BRO N,N↔SON 0,B
CAME 0,N↔GO L1
L2: POP1J
ENDR OBODY;2/18/73(BGB)----------------------------------------------
SUBR(OUTB3D,BODY) ;OUTPUT B3D BODY.
COMMENT ⊗------------------------------------------------------------
⊗
EXTERN DPYBUF
LAC 1,BODY↔TEST 1,BBIT↔POP1J ;BODIES ONLY.
SLACI'GEM'↔SKIPN GEMFLG↔SLACI'B3D' ;GEM OR B3D.
L1: CALL(GETFIL,0)↔POP1J ;GET FILE NAME.
INIT 1,10↔SIXBIT/DSK/↔XWD OBUF,0↔HALT
ENTER 1,FILNAM↔GO[RELEASE 1,
OUTSTR[ASCIZ/ ENTER FAILED./]
CRLF↔POP1J]
;SETUP OUTPUT BUFFERS.
PUSHP 121 ;SAVE.
LAC DPYBUF↔ADDI 20↔DAC 121
OUTBUF 1,
;OUTPUT TRANSFER.
CALL(OBODY,BODY)
;END OF FILE.
RELEASE 1,
SKIPG GEMFLG↔OUTSTR[ASCIZ/ EOF./]
POPP 121↔POP1J ;RESTORE.
ENDR OUTB3D;2/18/73(BGB)---------------------------------------------
SUBR(ICAM) ;INPUT CAMERA.
COMMENT ⊗------------------------------------------------------------
⊗
C←←10↔R←←11 ;CAMERA & FRAME.
POP 16,STRING↔POP 16,0↔DAPZ STRCNT
TDZA 1,1
L1: RELEASE 1,↔CALL(GETFIL,[SIXBIT/CAM/])↔GO[SETZ 1,↔POP0J]
INIT 1,10↔SIXBIT/DSK/↔IBUF↔HALT
LOOKUP 1,FILNAM↔GO L1
PUSH P,121↔LAC DPYBUF↔ADDI 20↔DAC 121↔INBUF 1,
;FETCH NOW CAMERA.
LAC C,UNIVERSE↑↔NWRLD C,C
NCAMR C,C↔FRAME R,C↔CALL(KLNODE↑,R)
;INPUT TRANSFER.
CALL(WORDIN)↔FMPR FEET↔PUSH P,0 ;CX
CALL(WORDIN)↔FMPR FEET↔PUSH P,0 ;CY
CALL(WORDIN)↔FMPR FEET↔PUSH P,0 ;CZ
CALL(WORDIN)↔PUSH P,0 ;PAN
CALL(WORDIN)↔PUSH P,0 ;TILT
CALL(WORDIN)↔PUSH P,0 ;SWING
CALL(MKROT1↑)↔FRAME. 1,C
POP P,ZWC(1)↔POP P,YWC(1)↔POP P,XWC(1)
CALL(WORDIN)↔FMPR FEET↔DAC 1(C) ;PDX
CALL(WORDIN)↔FMPR FEET↔DAC 2(C) ;PDY
CALL(WORDIN)↔FMPR FEET↔DAC 3(C) ;PDZ
CALL(WORDIN)↔FMPR FEET↔DAC 1 ;FOCAL
LACN 1↔FDVR 1(C)↔DAC -3(C) ;SCALEX
LACN 1↔FDVR 2(C)↔DAC -2(C) ;SCALEY
LACN 1↔FDVR 3(C)↔DAC -1(C) ;SCALEZ
DAC 1,3(C) ;FOCAL
;END OF FILE.
RELEASE 1,↔POP P,121
POP0J↔FEET:3.280833 ;FEET PER METER.
ENDR ICAM;2/21/73(BGB)-----------------------------------------------
SUBR(OCAM) ;OUTPUT CAMERA.
COMMENT ⊗------------------------------------------------------------
⊗
C←←10↔R←←11 ;CAMERA & FRAME.
L1: CALL(GETFIL,[SIXBIT/CAM/])↔POP0J
INIT 1,10↔SIXBIT/DSK/↔XWD OBUF,0↔HALT
ENTER 1,FILNAM↔GO[RELEASE 1,
OUTSTR[ASCIZ/ ENTER FAILED./]↔CRLF↔POP0J]
PUSH P,121↔LAC DPYBUF↑↔ADDI 20↔DAC 121↔OUTBUF 1,
;FETCH NOW CAMERA.
LAC 1,UNIVERSE↑↔NWRLD 1,1
NCAMR C,1↔FRAME R,C
;OUTPUT TRANSFER.
LAC -3(R)↔FMPR METERS↔CALL(WORDO,0) ;CX
LAC -2(R)↔FMPR METERS↔CALL(WORDO,0) ;CY
LAC -1(R)↔FMPR METERS↔CALL(WORDO,0) ;CZ
SETQ(TILT,{ACOS↑,{KZ(R)}})↔LACN KY(R) ;TILT ← ACOS(KZ).
SETQ(PAN,{ATAN2↑,{KX(R)},0}) ;PAN ← ATAN2(KX,-KY).
CALL(SIN↑,TILT)↔LAC JZ(R)
JUMPE 1,.+4↔FDVR 0,1
SETQ(SWING,{ACOS↑,0}) ;SWING ← ACOS(JZ/SIN(TILT))
CALL(WORDO,PAN)
CALL(WORDO,TILT)
CALL(WORDO,SWING)
LAC 1(C)↔FMPR METERS↔CALL(WORDO,0) ;PDX
LAC 2(C)↔FMPR METERS↔CALL(WORDO,0) ;PDY
LAC 2(C)↔FMPR METERS↔CALL(WORDO,0) ;PDZ
LAC 3(C)↔FMPR METERS↔CALL(WORDO,0) ;FOCAL
RELEASE 1,↔OUTSTR[ASCIZ/ EOF.
*/]↔ POP P,121↔POP0J
DECLARE{PAN,TILT,SWING}
METERS: 0.3048006 ;FEET/METER.
ENDR OCAM;2/18/73----------------------------------------------------
SUBR(IFEV,BODY) ;INPUT F.E.V. BLOCKS.
COMMENT ⊗------------------------------------------------------------
⊗
ACCUMULATORS{F,E,V,A,I,J,FACE,EDGE,VERTEX}
;SETUP BASE POINTER TO SERIAL TABLES.
SLACI I↔LAP 121
DAC FACE↔DAC EDGE↔DAC VERTEX
ADD VERTEX,FCNT
;MAKE AND INPUT FACES.
LACI I,1
L1: CALL(MKF,ARG1)↔DAC 1,@FACE
CALL(WORDIN)↔DAC 4(1) ;FACE REFLECTIVITY.
CALL(WORDIN)↔DAC 5(1) ;FACE LUMENOSITY.
SKIPN GEMFLG↔GO L1A
CALL(WORDIN)↔DAC 0(1) ;FACE TYPE BITS.
CALL(WORDIN)↔DAC 8(1) ;FACE USER WORD.
L1A: CAME I,FCNT↔AOJA I,L1
;MAKE AND INPUT EDGES.
LACI I,1
L2: CALL(MKE,ARG1)↔DIP 1,@EDGE
CALL(WORDIN)↔DAC 1(1) ;EDGE'S WINGS.
CALL(WORDIN)↔DAC 3(1)
CALL(WORDIN)↔DAC 4(1)
CALL(WORDIN)↔DAC 5(1)
SKIPN GEMFLG↔GO L2A
CALL(WORDIN)↔DAC 0(1) ;EDGE TYPE BITS.
CALL(WORDIN)↔DAC 8(1) ;EDGE USER WORD.
L2A: CAME I,ECNT↔AOJA I,L2
;MAKE AND INPUT VERTICES.
LACI I,1
L3: CALL(MKV,ARG1)↔DAP 1,@VERTEX
CALL(WORDIN)↔DAC XWC(1) ;VERTEX WORLD LOCUS.
CALL(WORDIN)↔DAC YWC(1)
CALL(WORDIN)↔DAC ZWC(1)
SKIPN GEMFLG↔GO L3A
CALL(WORDIN)↔DAC 0(1) ;VERTEX TYPE BITS.
CALL(WORDIN)↔DAC 8(1) ;VERTEX USER WORD.
L3A: CAME I,VCNT↔AOJA I,L3
;CONVERT SERIAL NUMBERS TO NODE ADDRESSES.
LACI J,1
L4: LAC I,J↔CAR E,@EDGE
NFACE I,E↔CDR F,@FACE↔NFACE. F,E↔PED. E,F
PFACE I,E↔CDR F,@FACE↔PFACE. F,E↔PED. E,F
NVT I,E↔CDR V,@VERTEX↔NVT. V,E↔PED. E,V
PVT I,E↔CDR V,@VERTEX↔PVT. V,E↔PED. E,V
NCW I,E↔CAR A,@EDGE↔NCW. A,E
PCW I,E↔CAR A,@EDGE↔PCW. A,E
NCCW I,E↔CAR A,@EDGE↔NCCW. A,E
PCCW I,E↔CAR A,@EDGE↔PCCW. A,E
CAME J,ECNT↔AOJA J,L4↔POP1J
ENDR IFEV;2/18/73(BGB)-----------------------------------------------
SUBR(IBODY,BODY0) ;INPUT A BODY AND ALL ITS PARTS.
COMMENT ⊗------------------------------------------------------------
⊗
ACCUMULATORS{N,B,B0}
;INPUT BODY HEADER.
CALL(WORDIN)↔DAC PCNT
CALL(WORDIN)↔DAC FCNT
CALL(WORDIN)↔DAC ECNT
CALL(WORDIN)↔DAC VCNT
;INPUT THE FEV SHELL OF THIS BODY.
SETQ(B1,{MKB,ARG1})
LAC B0,ARG1
JUMPN B0,[CALL(BATT,B1,B0)↔GO .+1]
LAC B,B1
CALL(WORDIN)↔DAC -2(B) ;PNAME.
CALL(WORDIN)↔DAC -1(B) ;PNAME.
SKIPN GEMFLG↔GO L1A
CALL(WORDIN)↔DAC 0(1) ;BODY TYPE BITS.
CALL(WORDIN)↔DAC 8(1) ;BODY USER WORD.
L1A:
;INPUT THE LOCATION ORIENTATION OF THIS BODY.
LACI 1,BFRAME-3↔LACI 2,=12↔SETZ 4,
L1: CALL(WORDIN)↔DAC(1)↔IORM 4↔AOS 1↔SOJG 2,L1
SKIPE 1,4↔CALL(MKFRAME)
FRAME. 1,B↔JUMPE 1,.+4
SLACI BFRAME-3↔LAPI XWC(1)↔BLT KZ(1)
CALL(IFEV,B)
LAC B,B1↔SKIPN ARG1↔DAC B,ARG1 ;RETURN VALUE TO TOP LEVEL.
;INPUT THE PARTS OF THIS BODY.
L2: SOSGE PCNT↔POP0J
PUSH P,PCNT↔PUSH P,B
CALL(IBODY)
POP P,B↔POP P,PCNT↔GO L2
B1:0
ENDR IBODY;2/18/73(BGB)----------------------------------------------
SUBR(INB3D) ;INPUT B3D FORMAT.
COMMENT ⊗------------------------------------------------------------
⊗
TDZA 1,1
L1: RELEASE 1,
SLACI'GEM'↔SKIPN GEMFLG↔SLACI'B3D' ;GEM OR B3D.
CALL(GETFIL,0)↔GO[SETZ 1,↔POP0J]
INIT 1,10↔SIXBIT/DSK/↔IBUF↔HALT
LOOKUP 1,FILNAM↔GO[
SKIPG GEMFLG↔GO L1
OUTSTR[ASCIZ/FILE NOT FOUND./]
RELEASE 1,↔SETZ 1,↔POP0J] ;SAILOR'S LOSE HERE.
;SETUP INPUT BUFFERS.
PUSHP 121
LAC DPYBUF↔ADDI 20↔DAC 121
INBUF 1,
;INPUT TRANSFER.
CALL(IBODY,[0])↔POP P,1
;END OF FILE.
RELEASE 1,↔POPP 121
SKIPG GEMFLG↔OUTSTR[ASCIZ/ EOF./]
POP0J
ENDR INB3D;2/18/73(BGB)----------------------------------------------
END
IO.FAI - EOF.